//对象的交 差 并 补
type A={
    name:string,
    age:number,
    address:string,
}

type B={
    name:string,
    male:boolean,
    address:number
}

//1、交集
type ObjectInter<T extends object,U extends object>=Pick<T,Extract<keyof T,keyof U>>
//有相同的属性，谁在前面，就以谁的类型为准
type R1=ObjectInter<A,B>
type R11=ObjectInter<B,A>

//2、差集
type ObjectDiff<T extends object,U extends object>=Pick<T,Exclude<keyof T,keyof U>>
//找出第一个在第二个种没有的属性
type R2=ObjectDiff<A,B>
type R21=ObjectDiff<B,A>

//3、补集，就是差集，不过A1和B1要求有父子关系(T extends U)
type A1={
    name:string,
    age:number,
    address:string,

}

type B1={
    name:string,
    age:number,
}
type ObjectCom<T extends U,U extends object>=Pick<T,Exclude<keyof T,keyof U>>
//找出第一个在第二个种没有的属性
type R3=ObjectDiff<A1,B1>
type R31=ObjectDiff<B1,A1>

//3、重写
//以后面的类型为准，再加上前面比后面多的类型 mixin
//有后面同样存在的key，覆盖掉前面的key，以后面key的类型为准，前面多的还是保留
type Overwrite<T extends object,U extends object>=ObjectInter<U,T> & ObjectDiff<T,U>
type Com<T>={
    [K in keyof T]:T[K]
}
type R4=Com<Overwrite<A,B>>
export {}